首先说一下,这个程序的保密性不高= =!,就当练习玩。
最近刚刚学完双循环链表。就做了个这个
加密思路是,根据随机生成的密匙,对26字母进行移位;来选取密文。密匙大小为0~99;
程序比较简单,但是写完这个对我有很大的提高。
在调试过程中发现了许多自己的问题,比如说,加了循环没有加跳出去的条件。导致死循环,嗯,很多都是这个问题;
还有一个就是,在将密匙写入文件时,要将密匙以大写的字符形式的16进制保存。
然后我就想偷懒用fprintf来格式化直接写入文件16进制,随后就发现个问题;
就是当数值为0x0F时,他会将高位的0变成空白符,只写入F。
后来我就想把文件里的空格替换成字符'0',但是呢问题又来了,每当我fseek设置文件位置指针的时候,总是会指向文件头;
然后用了各种方法,包括手动来修改指针,无果。。。。
后来要朋友试一下,他那没问题...没问题...然后我就凌乱了。
= =所以出来了现在这样的程序,我不用偷懒的方法了。
话说,个人觉得 进制转换那个函数的思想是最好的。
**************************************************************************************************************
2013-10-01更新...
搞了一天,现在已经支持大小写英文,数字,和其他字符。
关于小写的支持,是在大写字符处理的基础上增加了大小写转换(= =.这货就是想偷懒儿...)
刚开始写大小写转换的功能代码片段的时候,觉得重复性太强。就封装到函数里了,不过我怎么觉得封装之后比不封装更复杂?
在写数字支持的时候,发现自己的代码顺序摆放好不科学,属于一个功能区的东西都被分开了。
增加各种支持后,就不得不对于实现同功能的代码放到一起。
好吧,又有进步了。
下面贴文件,
顺序为:文档,函数头,身子。。
文档:
名称:Vigenere[维吉尼亚]
功能:用维吉尼亚方法对字符串进行加密/解密。
生成:程序运行后会根据加密解密选择,生成相应的文件。
文件内容:
if(加密)
{
将密文和密匙顺序交替写入文件;
例如:A(密文) + BF(密匙) = ABF
}
if(解密)
{
保存明文到文件;
}
需要的函数:
1. Slist Letter() [字母字典]
2. Slist Number() [数字字典]
2. char Matching(char plain, int key, Slist head, FLAG flag) [密文/明文匹配]
3. char upper_lower(FLAG *cflag, char letter) [大小写转换]
4. int convert(FLAG flag, char pword[2], int key) [进制转换]
5. void Plaintext() [对输入的明文保存到文件]
6. int Key(int seed) [随机生成密匙]
7. void Encryption(Slist Let_head, Slist Num_head) [加密]
8. void Decryption(Slist Let_head, Slist Num_head) [解密]
9. void UI() [简易界面]
注:加密/解密方法
1.将 密匙%26 取余;
2.使用字典进行匹配;
匹配方法:
用取余后的密匙,循环查找字符。
例如 密匙为2,明文为A, 那么密文就是C;
解密的方法和这个相反,密文为C,明文就为A;
密文的存储方法是 密文+密匙;
所以在进行解密的时候,每次取三个字符,计算密匙对密文进行解密;
程序大致运行流程/思路:
1.进入选择界面
2.用户输入选择后,转入相应的功能
(Encryption加密)
{
加密下有两个选项:
(1,直接输入明文)
{
将输入的明文保存到 plaintext.txt 文件;
直接转到下面
}
(2,从 plaintext.txt 的文件中获取明文)
{
while(非 文件尾){
生成随机密匙;
对密匙进行计算,获取文件中的明文进行加密
将密文保存到文件中;
将密匙转换成字符的16进制形式
将字符的16进制的密匙保存到密文后
}
删除 plaintext.txt 明文文件
}
}
(Decryption解密)
{
解密只能从此程序生成的文件中获取密文
{
分别获取密文和密匙;
对字符型密匙转换成数据型10进制密匙
计算密匙,对密文进行解密
将明文保存到文件
}
}
函数头:
#if 0
名称:vigenere.h
内容:程序所用到的定义以及函数;
1. Slist Letter() [字母字典]
2. Slist Number() [数字字典]
2. char Matchin